/**
 * @file    main.c 
 * @author  18408107475@163.com
 * @version V1.0.0
 * @date    2025-06-19
 * @brief   HC-SR04超声波测距主程序
 * @details 
 * 硬件配置：
 *   - MCU: STM32F103ZET6 (72MHz Cortex-M3)
 *   - 超声波模块: HC-SR04 (Trig: PB8, Echo: PB9)
 *   - 显示屏: OLED SSD1315 (I2C接口)
 *   - 串口: USART1 (PA9-TX, PA10-RX, 115200bps)
 * 
 * 软件特性：
 *   - 使用TIM4定时器测量回波时间(1us分辨率)
 *   - 外部中断检测回波信号
 *   - OLED实时显示距离数据
 *   - 串口输出调试信息
 */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"          // STM32标准外设库（必需核心头文件）
#include "Delay.h"              // 精确延时函数（基于SysTick实现）
#include "USART1_Config.h"      // USART1初始化及printf重定向
#include "OLED_SSD1315_Config.h"// OLED SSD1315驱动（I2C接口）
#include "HC_SR04_Config.h"     // HC-SR04驱动（包含TIM4配置）
#include "TIM_Config.h"         // TIM4定时器中断配置

/* 私有变量定义 --------------------------------------------------------------*/
float distance;  // 存储当前测量距离值（单位：厘米）
                 // 注意：全局变量但未使用volatile修饰
                 // 因为仅在主循环中单线程访问

/**
 * @brief  主程序入口
 * @param  None
 * @retval int 程序状态码（实际不会返回）
 * @执行流程：
 *         1. 初始化阶段：
 *            - 配置USART1串口（调试输出）
 *            - 初始化OLED显示屏
 *            - 配置HC-SR04硬件
 *         2. 主循环：
 *            - 获取超声波距离数据
 *            - OLED显示距离值
 *            - 保持60ms测量间隔
 */
int main(void)
{
    /* 硬件初始化阶段 ------------------------------------------------*/
    // 初始化USART1（PA9-TX, PA10-RX, 115200bps）
    USART1_Config(115200);     
    USART1_Printf("System Init...\r\n");  // 发送启动信息
    
    // OLED初始化流程
    OLED_SSD1315_Init();        // 初始化I2C接口和SSD1315控制器
    OLED_SSD1315_Display_On();  // 开启显示（启动内部DC-DC电路）

    // OLED启动自检（全屏点亮→清屏）
	OLED_SSD1315_ON();         // 全屏点亮（写入0xFF）
    Delay_ms(100);             // 保持100ms（可见效果）
    OLED_SSD1315_Clear();      // 清屏（写入0x00）
    Delay_ms(100);             // 保持100ms

    // 超声波模块初始化
    HC_SR04_Config();          // 配置GPIO和TIM4定时器
    USART1_Printf("HC-SR04 Ready\r\n");  // 发送就绪信息
    
    /* 显示静态界面 */
    OLED_SSD1315_Clear();  // 清屏准备显示
    OLED_SSD1315_ShowString(0, 0, "Ultrasonic", 16, 1);  // 第0行显示标题
    OLED_SSD1315_ShowString(0, 3, "Distance:", 16, 1);    // 第3行显示标签

    /* 主任务循环 ----------------------------------------------------*/
    while (1)  // 无限循环
    {
        /* 超声波测距 */
		distance = HCSR04_Get_Distance();  // 获取5次平均距离（单位cm）
		
		/* OLED显示结果（格式：XXX.XX cm） */
		OLED_SSD1315_ShowNum(80, 3, distance, 5, 16);  // 在第3行第80列显示数值
		
		/* 控制测量间隔（HC-SR04要求≥60ms） */
		Delay_ms(60);  // 精确延时60毫秒
    }
    
    return 0;  // 程序不会执行到这里（保持语法完整性）
}

/************************ (C) COPYRIGHT 2025 Embedded Team *****END OF FILE****/
